package agencia;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import javax.xml.datatype.XMLGregorianCalendar;

import agencia.exceptions.LugarInsuficienteException;

import com.agencia.ws.cliente.AterrizarWSDelegate;
import com.agencia.ws.cliente.AterrizarWSService;
import com.agencia.ws.cliente.Pasajero;
import com.agencia.ws.cliente.VueloWs;

public class ReservaVuelo {
	
	private Long id;
	private Long idPaquete;
	private VueloWs vuelo;
	private String nroVuelo;
	private XMLGregorianCalendar   fechaPartida;
	private XMLGregorianCalendar   fechaLlegada;
	private Collection<String> nroReservas = new ArrayList<String>();

	
	public ReservaVuelo(){
		VueloWs vuelo = new VueloWs();
		this.vuelo = vuelo;
	}
	
	public ReservaVuelo (VueloWs vuelo){
		setVuelo(vuelo);
	}
	
	public void reservar (Collection<Pasajero> pasajeros) throws LugarInsuficienteException{
		//this.nroReservas = this.vuelo.reservar(pasajeros);	
		String nroReserva = "";
				
		AterrizarWSService servicio = new AterrizarWSService();
		AterrizarWSDelegate delegate = servicio.getAterrizarWSPort();
		
		for (Iterator<Pasajero> iPasajero = pasajeros.iterator(); iPasajero.hasNext();) {
			Pasajero pasajero = iPasajero.next();
			nroReserva = "";
			for (Iterator<Integer> iAsiento = this.vuelo.getAsientos().iterator(); iAsiento.hasNext() & nroReserva.equals("");) {
				int asiento = iAsiento.next();
				nroReserva = delegate.reservarVuelo(this.vuelo.getNroVuelo(), asiento, pasajero);				
			}			
			if (!nroReserva.equals("")){
				this.nroReservas.add(nroReserva);
			}				
		}				
		if (nroReserva.equals("")){
			this.cancelar(pasajeros);
			throw new LugarInsuficienteException("No existen lugares suficientes para concretar la reserva");
		}		
	}
	
	public void cancelar(Collection<Pasajero> pasajeros){		
		AterrizarWSService servicio = new AterrizarWSService();
		AterrizarWSDelegate delegate = servicio.getAterrizarWSPort();

		for (Iterator<String> iReserva = this.nroReservas.iterator(); iReserva.hasNext();) {
			String reserva = iReserva.next();
			double importe = delegate.cancelarReserva(reserva);
		}
		this.nroReservas.clear();
	}
	
	public void comprar(Collection<Pasajero> pasajeros){		
		AterrizarWSService servicio = new AterrizarWSService();
		AterrizarWSDelegate delegate = servicio.getAterrizarWSPort();
		
		for (Iterator<String> iReserva = this.nroReservas.iterator(); iReserva.hasNext();) {
			String reserva = iReserva.next();
			double importe = delegate.comprarPasaje(reserva);
		}		
	}
	
	public VueloWs getVuelo() {
		return vuelo;
	}

	public void setVuelo(VueloWs vuelo) {
		this.vuelo = vuelo;
	}

	public Collection<String> getReservasVuelos() {
		return nroReservas;
	}

	public void setReservasVuelos(Collection<String> reservasVuelos) {
		this.nroReservas = reservasVuelos;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Collection<String> getNroReservas() {
		return nroReservas;
	}

	public void setNroReservas(Collection<String> nroReservas) {
		this.nroReservas = nroReservas;
	}

	public Long getIdPaquete() {
		return idPaquete;
	}

	public void setIdPaquete(Long idPaquete) {
		this.idPaquete = idPaquete;
	}

	public String getNroVuelo() {
		this.nroVuelo =  this.vuelo.getNroVuelo();
		return nroVuelo;
	}

	public void setNroVuelo(String nroVuelo) {
		this.nroVuelo = nroVuelo;
		this.vuelo.setNroVuelo(nroVuelo);
	}

	public XMLGregorianCalendar getFechaPartida() {
		this.fechaPartida = this.vuelo.getFechaPartida();
		return fechaPartida;
	}

	public void setFechaPartida(XMLGregorianCalendar fechaPartida) {
		this.fechaPartida = fechaPartida;
		this.vuelo.setFechaPartida(fechaPartida);
	}

	public XMLGregorianCalendar getFechaLlegada() {
		this.fechaLlegada = this.vuelo.getFechaLlegada();
		return fechaLlegada;
	}

	public void setFechaLlegada(XMLGregorianCalendar fechaLLegada) {		
		this.fechaLlegada = fechaLLegada;
		this.vuelo.setFechaLlegada(fechaLlegada);
	}
}
